<?php
/**
 * "YMenu" Multi Level Menu
 *
 * menu code source: <a href="http://apycom.com/">Apycom jQuery Menus</a>
 *
 * @author hiscaler <hiscaler@gmail.com>
 * @link http://www.yuandot.com/
 * @copyright Copyright &copy; 2009-2010 Yuandot Information Technology CO.,LTD.
 * @license http://doit.yuandot.com/license/
 */

Yii::import('zii.widgets.CMenu');

class YMenu extends CMenu {
    private $baseUrl;

    public $cssFile;
    public $activateParents=true;

    /**
     * Give the last items css 'last' style
     */
    protected function cssLastItems($items) {
        $i = max(array_keys($items));
        $item = $items[$i];

        if(isset($item['itemOptions']['class']))
            $items[$i]['itemOptions']['class'].=' last';
        else
            $items[$i]['itemOptions']['class']='last';

        foreach($items as $i=>$item) {
            if(isset($item['items'])) {
                $items[$i]['items']=$this->cssLastItems($item['items']);
            }
        }

        return array_values($items);
    }

    /**
     * Give the last items css 'parent' style
     */
    protected function cssParentItems($items) {
        foreach($items as $i=>$item) {
            if(isset($item['items'])) {
                if(isset($item['itemOptions']['class']))
                    $items[$i]['itemOptions']['class'].=' parent';
                else
                    $items[$i]['itemOptions']['class']='parent';
            }
        }

        return array_values($items);
    }

    /**
     * Initialize the widget
     */
    public function init() {
        if (!$this->getId(false)) {
            $this->setId('menu');
        }
            
//        $this->items=$this->cssLastItems($this->items);
//        CVarDumper::dump($this->items, 10, true);
        $fix = $this->items;
//        CVarDumper::dump($fix, 10, true);
        $i = count($fix);
        $i = $i - 1;
//        echo $i;
        if (isset($fix[$i]['itemOptions']['class'])) {
           $fix[$i]['itemOptions']['class'] .= ' last' ;
        } else {
            $fix[$i]['itemOptions']['class'] = 'last';
        }
        $this->items = $fix;
//        if(isset($this->items['itemOptions']['class']))
//            $items[$i]['itemOptions']['class'].=' parent';
//        else
//            $items[$i]['itemOptions']['class']='parent';
//        $this->items=$this->cssParentItems($this->items);
//        exit;
        parent::init();
    }


    /**
     * Publishes the assets
     */
    public function publishAssets() {
        $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'assets';
        $this->baseUrl = Yii::app()->getAssetManager()->publish($dir);
    }

    /**
     * Registers the external javascript files
     */
    public function registerClientScripts() {
    // add the script
        $cs = Yii::app()->getClientScript();
        $cs->registerCoreScript('jquery');
        $baseDir = dirname(__FILE__);
        $assets = Yii::app()->getAssetManager()->publish($baseDir.DIRECTORY_SEPARATOR.'assets');
        $cs->registerScriptFile($assets.'/menu.js');
    }

    public function registerCssFile($url=null) {
    // add the css
        if ($this->baseUrl === '')
            throw new CException(Yii::t('YMenu', 'baseUrl must be set. This is done automatically by calling publishAssets()'));

        $cs=Yii::app()->getClientScript();
        if($url===null)
            $url=$this->baseUrl.'/menu.css';
        $cs->registerCssFile($url,'screen');
    }

    protected function renderMenuRecursive($items) {
        foreach($items as $item) {
            echo CHtml::openTag('li', isset($item['itemOptions']) ? $item['itemOptions'] : array());
            if(isset($item['url']))
                echo CHtml::link('<span>'.$item['label'].'</span>',$item['url'],isset($item['linkOptions']) ? $item['linkOptions'] : array());
            //                echo CHtml::link($item['label'],$item['url'],isset($item['linkOptions']) ? $item['linkOptions'] : array());
            else
                echo CHtml::tag('span',isset($item['linkOptions']) ? $item['linkOptions'] : array(), $item['label']);
            if(isset($item['items']) && count($item['items'])) {
                echo "\n".CHtml::openTag('ul',$this->submenuHtmlOptions)."\n";
                $this->renderMenuRecursive($item['items']);
                echo CHtml::closeTag('ul')."\n";
            }
            echo CHtml::closeTag('li')."\n";
        }
    //        foreach($items as $item) {
    //            echo CHtml::openTag('li', isset($item['itemOptions']) ? $item['itemOptions'] : array());
    //            if(isset($item['url']))
    //                echo CHtml::link('<span>'.$item['label'].'</span>',$item['url'],isset($item['linkOptions']) ? $item['linkOptions'] : array());
    //            else
    //                echo CHtml::link('<span>'.$item['label'].'</span>',"javascript:void(0);",isset($item['linkOptions']) ? $item['linkOptions'] : array());
    //            if(isset($item['items']) && count($item['items'])) {
    //                echo "\n".CHtml::openTag('ul',$this->submenuHtmlOptions)."\n";
    //                $this->renderMenuRecursive($item['items']);
    //                echo CHtml::closeTag('ul')."\n";
    //            }
    //            echo CHtml::closeTag('li')."\n";
    //        }
    }

    protected function normalizeItems($items,$route,&$active) {
        foreach($items as $i=>$item) {
            if(isset($item['visible']) && !$item['visible']) {
                unset($items[$i]);
                continue;
            }
            if($this->encodeLabel)
                $items[$i]['label']=CHtml::encode($item['label']);
            $hasActiveChild=false;
            if(isset($item['items'])) {
                $items[$i]['items']=$this->normalizeItems($item['items'],$route,$hasActiveChild);
                if(empty($items[$i]['items']) && $this->hideEmptyItems)
                    unset($items[$i]['items']);
            }
            if(!isset($item['active'])) {
                if($this->activateParents && $hasActiveChild || $this->isItemActive($item,$route))
                    $active=$items[$i]['active']=true;
                else
                    $items[$i]['active']=false;
            }
            else if($item['active'])
                    $active=true;
            if($items[$i]['active'] && $this->activeCssClass!='') {
                if(isset($item['itemOptions']['class']))
                    $items[$i]['itemOptions']['class'].=' '.$this->activeCssClass;
                else
                    $items[$i]['itemOptions']['class']=$this->activeCssClass;
            }
        }
        return array_values($items);
//        foreach($items as $i=>$item) {
//            if(isset($item['visible']) && !$item['visible']) {
//                unset($items[$i]);
//                continue;
//            }
//            if($this->encodeLabel)
//                $items[$i]['label']=CHtml::encode($item['label']);
//            $hasActiveChild=false;
//            if(isset($item['items'])) {
//                $items[$i]['items']=$this->normalizeItems($item['items'],$route,$hasActiveChild, 1);
//                if(isset($item['itemOptions']['class']))
//                    $items[$i]['itemOptions']['class'].=' parent';
//                else
//                    $items[$i]['itemOptions']['class']='parent';
//                if(empty($items[$i]['items']) && $this->hideEmptyItems)
//                    unset($items[$i]['items']);
//            }
//            if(!isset($item['active'])) {
//                if(($this->activateParents && $hasActiveChild) || $this->isItemActive($item,$route))
//                    $active=$items[$i]['active']=true;
//                else
//                    $items[$i]['active']=false;
//            }
//            else if($item['active'])
//                    $active=true;
//            if($items[$i]['active'] && $this->activeCssClass!='' && !$ischild) {
//                if(isset($item['itemOptions']['class']))
//                    $items[$i]['itemOptions']['class'].=' '.$this->activeCssClass;
//                else
//                    $items[$i]['itemOptions']['class']=$this->activeCssClass;
//            }
//        }
//        return array_values($items);
    }

    /**
     * Run the widget
     */
    public function run() {
        $this->publishAssets();
        $this->registerClientScripts();
        $this->registerCssFile($this->cssFile);

        $htmlOptions['id']='menu';
        echo CHtml::openTag('div',$htmlOptions)."\n";
        parent::run();
        echo CHtml::closeTag('div');
    }

}